
const http = require('http');
const https = require('https');
const fs = require('fs');
const { URL } = require('url');

/**
 * 根据url自动判断需要http还是https请求
 * @param urlString {String} 参数 请求地址
 * @param options {Object} 参数
 * {
 *    method // 方法类型
 *    headers // 请求头
 *    data // 请求体
 * 
 *    // 相应类型，可选。具体值： DownloadFile=下载文件； base64=返回base64类型数据
 *    responseType 
 *      outputFilePath // 下载文件到本地的路径。 responseType=DownloadFile
 * }
 * @param callback {Function} 参数 callback(error, response)
 * response={
 *    status // 响应状态
 *    headers // 响应头
 *    data // 响应数据
 *    saveFilePath // 保存文件的路径. responseType=DownloadFile
 *    base64Src // base64类型数据. responseType=base64
 * }
 **/
function sendRequest(urlString, options = {}, callback = () => { }) {
  if (!urlString) return;
  const url = new URL(urlString);
  const protocol = url.protocol === 'https:' ? https : http;

  const reqOptions = {
    hostname: url.hostname,
    port: url.port || (url.protocol === 'https:' ? 443 : 80),
    path: url.pathname + url.search,
    method: options.method || 'GET',
    headers: options.headers || {}
  };

  // 处理不同的内容和主体
  if (options.data) {
    let data = options.data;
    if (typeof data === 'object' && !(data instanceof Buffer)) {
      data = JSON.stringify(data);
      reqOptions.headers['Content-Type'] = 'application/json';
    } else if (Buffer.isBuffer(data)) {
      reqOptions.headers['Content-Length'] = data.length;
    } else {
      reqOptions.headers['Content-Length'] = Buffer.byteLength(data);
    }
  }

  const req = protocol.request(reqOptions, (res) => {
    let data = [];
    res.on('data', (chunk) => { data.push(chunk); });

    res.on('end', () => {
      const responseData = Buffer.concat(data);
      let obj = {
        status: res.statusCode,
        headers: res.headers,
        data: responseData,
      };
      // console.log(`==obj==`, obj)

      // 可选地，处理不同的响应类型
      if (options.responseType === 'DownloadFile') {
        fs.writeFileSync(options.outputFilePath, responseData);
        obj = { ...obj, saveFilePath: options.outputFilePath }
      }
      else if (options.responseType === 'base64') {
        var base64Img = responseData.toString('base64'); //将Buffer对象转换为字符串并以base64编码格式显示
        let content_type = res.headers['content-type'];
        let base64Src = `data:${content_type}` + ';base64,' + base64Img; // 最终可以赋值到img标签中的src属性
        obj = { ...obj, base64Src }
      }
      callback(null, { ...obj });
    });
  });

  // 处理异常
  req.on('error', (e) => { callback(e); });
  // 写入请求体
  if (options.data) { req.write(options.data); }
  // 发送请求
  req.end();
}

module.exports = { sendRequest };
